import fg from "fast-glob"
import fs from "fs"
import path from "path"
import sharp from "sharp"

// 設定目錄路徑（放在上方方便修改）
const TARGET_IMAGE_DIR = "../src/assets/images"

// 獲取當前執行目錄的安全方法
const getCurrentDir = () => {
    // 獲取當前工作目錄
    const workingDir = process.cwd()

    // 如果在 tools 目錄下執行
    if (workingDir.endsWith("tools")) {
        return path.join(workingDir, "..")
    }

    // 如果在項目根目錄執行
    const srcDir = path.join(workingDir, "src")
    if (fs.existsSync(srcDir)) {
        return workingDir
    }

    // 其他情況，嘗試向上級尋找
    return path.resolve(workingDir, "..")
}

// 獲取項目根目錄
const rootDir = getCurrentDir()

// 計算目標圖片目錄的絕對路徑
const assetsDir = path.resolve(rootDir, TARGET_IMAGE_DIR.replace(/^\.\.\//, ""))

/**
 * 處理並轉換圖片為 WebP 格式
 */
async function processImage(imagePath: string) {
    const ext = path.extname(imagePath).toLowerCase()

    // 1. 檢查是否為 webp 或 svg，如果是則跳過
    if (ext === ".webp" || ext === ".svg") {
        console.log(`⏩ 已是 ${ext} 格式，跳過處理: ${imagePath}`)
        return
    }

    try {
        // 2. 轉換為 webp 並覆蓋原始檔案
        const webpOutput = imagePath.replace(ext, ".webp")

        // 先備份原始檔案（可選）
        const backupPath = `${imagePath}.backup`
        fs.copyFileSync(imagePath, backupPath)

        // 轉換為 webp
        const result = await sharp(imagePath).webp({ quality: 75 }).toFile(webpOutput)

        // 刪除原始檔案
        fs.unlinkSync(imagePath)

        // 刪除備份（如果不需要保留備份，可解除此註解）
        fs.unlinkSync(backupPath)

        console.log(`✅ 轉換完成: ${imagePath} → ${webpOutput} (${result.size} bytes)`)
    } catch (err) {
        console.error(`❌ 處理失敗: ${imagePath}`, err)
    }
}

/**
 * 主程式流程
 */
async function main() {
    console.log("🔍 正在掃描圖片資源目錄...")
    console.log(`📁 目標目錄: ${assetsDir}`)

    // 找出所有非 webp 和 svg 的圖片檔案
    const imageFiles = await fg("**/*.{jpg,jpeg,png,gif}", {
        cwd: assetsDir,
    })

    console.log(`📦 共找到 ${imageFiles.length} 張需要處理的圖片\n`)

    // 處理每一個檔案
    for (const relativePath of imageFiles) {
        const inputPath = path.join(assetsDir, relativePath)
        await processImage(inputPath)
    }

    console.log("\n🎉 所有圖片處理完成！")
}

// 執行主程式
main()
